Complex Queries এবং Nested Subqueries হল SQL কুয়েরি লেখার জন্য উন্নত কৌশল, যা বিভিন্ন টেবিলের মধ্যে জটিল সম্পর্ক ও ডেটা প্রক্রিয়াকরণ করতে সাহায্য করে। NHibernate-এ এই ধরনের কুয়েরি তৈরি করতে আপনাকে HQL (Hibernate Query Language) বা Native SQL ব্যবহার করতে হবে, যেগুলি ডেটাবেসের জটিল কুয়েরি পরিচালনা করতে সক্ষম।
Complex Query কী?
একটি Complex Query সাধারণত একাধিক শর্ত, জয়েন (join), গ্রুপিং (grouping), অর্ডারিং (ordering) ইত্যাদি শর্ত নিয়ে তৈরি হয়। NHibernate-এ যখন আপনি জটিল কুয়েরি তৈরি করবেন, তখন আপনাকে HQL বা Criteria API ব্যবহার করে কাঙ্ক্ষিত ডেটা প্রক্রিয়া করতে হবে।
Complex Query তৈরি করা (HQL)
ধরা যাক, Employee এবং Department টেবিলের মধ্যে একটি জটিল কুয়েরি তৈরি করতে হবে যেখানে একজন কর্মী একটি নির্দিষ্ট বয়সের (30 বছর) বেশি এবং তাদের Department এর নাম 'IT' হতে হবে।
using (ISession session = sessionFactory.OpenSession())
{
var query = session.CreateQuery(
"SELECT e FROM Employee e " +
"WHERE e.age > :age AND e.department.name = :deptName")
.SetParameter("age", 30)
.SetParameter("deptName", "IT");
var employees = query.List<Employee>();
foreach (var employee in employees)
{
Console.WriteLine($"Id: {employee.Id}, Name: {employee.Name}, Age: {employee.Age}");
}
}
এখানে, e.age > :age এবং e.department.name = :deptName এর মাধ্যমে দুটি শর্ত যুক্ত করা হয়েছে। প্রথম শর্তে বয়স এবং দ্বিতীয় শর্তে Department নামের উপর ফিল্টার করা হচ্ছে।
Nested Subquery কী?
Nested Subquery হল এক ধরনের কুয়েরি যেখানে একটি সাব-কুয়েরি আরেকটি কুয়েরির মধ্যে থাকে। এটি সাধারণত একাধিক টেবিলের মধ্যে ডেটা সম্পর্কিত প্রশ্নের উত্তর খুঁজতে ব্যবহৃত হয়। এক বা একাধিক সাব-কুয়েরি মূল কুয়েরির ভেতর থাকে, এবং এই সাব-কুয়েরি মূল কুয়েরির ফলাফল নির্ধারণে সাহায্য করে।
Nested Subquery Example (HQL)
ধরা যাক, আপনাকে এমন একটি কুয়েরি তৈরি করতে হবে যেখানে Employee টেবিল থেকে এমন কর্মীদের নির্বাচন করতে হবে যারা তাদের Department এর সবচেয়ে উচ্চ বেতন প্রাপ্ত কর্মী নন।
using (ISession session = sessionFactory.OpenSession())
{
var query = session.CreateQuery(
"FROM Employee e " +
"WHERE e.salary < (SELECT MAX(e2.salary) FROM Employee e2 WHERE e2.department.id = e.department.id)"
);
var employees = query.List<Employee>();
foreach (var employee in employees)
{
Console.WriteLine($"Id: {employee.Id}, Name: {employee.Name}, Salary: {employee.Salary}");
}
}
এখানে, MAX(e2.salary) একটি সাব-কুয়েরি যা প্রতিটি Department এর সর্বোচ্চ বেতন প্রদানকারী কর্মীটির বেতন নির্ধারণ করে এবং সেই বেতন অপেক্ষা কম বেতন প্রাপ্ত কর্মীদের নির্বাচন করা হয়। এই কুয়েরিতে Nested Subquery ব্যবহৃত হয়েছে, যেখানে একটি সাব-কুয়েরি অন্য একটি কুয়েরির অংশ হিসেবে কাজ করছে।
Complex Query with Multiple Joins
ধরা যাক, আপনি একটি কুয়েরি তৈরি করতে চান যেখানে Employee এবং Department টেবিলের মধ্যে জয়েন (join) রয়েছে এবং সেই সঙ্গে বয়স, বেতন এবং ডিপার্টমেন্টের নামের শর্ত অনুসারে ডেটা বের করতে হবে। NHibernate-এ এই কুয়েরি তৈরি করতে আমরা HQL ব্যবহার করতে পারি।
using (ISession session = sessionFactory.OpenSession())
{
var query = session.CreateQuery(
"SELECT e FROM Employee e " +
"JOIN e.department d " +
"WHERE e.age > :age AND e.salary > :salary AND d.name = :deptName"
)
.SetParameter("age", 30)
.SetParameter("salary", 50000)
.SetParameter("deptName", "IT");
var employees = query.List<Employee>();
foreach (var employee in employees)
{
Console.WriteLine($"Id: {employee.Id}, Name: {employee.Name}, Department: {employee.Department.Name}, Salary: {employee.Salary}");
}
}
এখানে, JOIN e.department d অংশটি Employee এবং Department টেবিলের মধ্যে একটি জয়েন তৈরি করছে। তারপর আমরা বয়স, বেতন এবং ডিপার্টমেন্টের নামের শর্তগুলি প্রয়োগ করছি।
Native SQL ব্যবহার করে Complex Query
যখন আপনাকে আরও জটিল বা বিশেষ ধরনের SQL কুয়েরি প্রয়োগ করতে হয়, তখন Native SQL ব্যবহার করা হয়। NHibernate-এ Native SQL কুয়েরি চালানোর জন্য CreateSQLQuery মেথড ব্যবহার করা হয়।
Native SQL with Nested Subquery Example:
ধরা যাক, আপনি এমন একটি কুয়েরি তৈরি করতে চান যা Employee টেবিল থেকে এমন কর্মীদের নির্বাচন করবে, যাদের বেতন তাদের Department এর সর্বোচ্চ বেতন থেকে কম। Native SQL এর মাধ্যমে এই কুয়েরি চালানো যাবে:
using (ISession session = sessionFactory.OpenSession())
{
var query = session.CreateSQLQuery(
"SELECT e.Id, e.Name, e.Age, e.Salary " +
"FROM Employee e " +
"WHERE e.Salary < (" +
"SELECT MAX(e2.Salary) " +
"FROM Employee e2 " +
"WHERE e2.DepartmentId = e.DepartmentId)"
);
var result = query.List<object[]>();
foreach (var row in result)
{
Console.WriteLine($"Id: {row[0]}, Name: {row[1]}, Salary: {row[3]}");
}
}
এখানে, একটি Native SQL কুয়েরি ব্যবহার করা হয়েছে যাতে Employee টেবিলের এমন কর্মীদের বেতন পাওয়া যায়, যাদের বেতন তাদের Department এর সর্বোচ্চ বেতন অপেক্ষা কম।
Conclusion
Complex Queries এবং Nested Subqueries হল NHibernate-এ জটিল ডেটাবেস অপারেশন করার শক্তিশালী কৌশল। HQL বা Native SQL এর মাধ্যমে আপনি এই ধরনের কুয়েরি তৈরি করতে পারেন, যেখানে একাধিক শর্ত, জয়েন এবং সাব-কুয়েরি ব্যবহৃত হয়। এই কৌশলগুলি ব্যবহার করে আপনি বড় আকারের ডেটাবেসে জটিল ডেটা অনুসন্ধান এবং ব্যবস্থাপনা করতে পারবেন।
Read more